/**
 * @file CRhoTabAlg.hpp Deklarácia triedy CRhoTabAlg.
 *
 * @author Martin Kosorinský.
 * @date 1.4.2009.
 */

#ifndef CRHOTABALG_HEADER
#define CRHOTABALG_HEADER

#include "CRhoAlgCommon.hpp"
#include "CRhoTable.hpp"

/**
 * @brief Trieda algoritmu Pollard-Rho s tabuľkovou detekciou kolízií.
 * Trieda zapúzdruje metódy a dátové prvky potrebné pri výpočte diskrétneho logaritmu
 * v grupe bodov eliptickej krivky. Trieda využíva algoritmus známy pod menom Pollard-Rho.
 * Na detekciu kolízií vyžíva tabuľku #CRhoTable, založenú na STL kontajneroch využívajúcich
 * hašovacie tabuľky. Do tabuľky sú ukladané len tzv. @a distinguished bodu, ktoré prejdú parametrizovaným
 * testom.
 */
class CRhoTabAlg : CRhoAlgCommon {
public:
    /**
     * @brief Hlavná metóda spúšťajúca výpočet diskrétneho logaritmu.
     * Metóda pracuje na základe vopred inicializovaných nastavení kontextu, medzi ktoré patria parametre
     * krivky, generátor a bod, ktorého diskrétny logaritmus hľadáme.
     * Počas výpočtu sú všetky náhodne vygenerované body eliptickej krivky uložené do tabuľky. Algoritmus
     * končí v momente, keď sa mu podarí nájsť bod, ktorý sa už nachádza v tabuľke a zároveň informácie o
     * kolízii sú dostatočné na výpočet hľadaného diskrétneho logaritmu.
     * @param[out] vysledok Premenná typu big, do ktorej bude uložený výsledok v prípade úspechu výpočtu.
     * Pamäť musí byť vopred alokovaná.
     * @param[in] distParam  Parameter filtrovania @a distinguished bodov (viz. #isDistinguished).
     * @warning V prípade neúspechu výpočtu obsahuje premenná @a výsledok nedefinovanú hodnotu.
     * @return Vráti TRUE v prípade úspechu výpočtu, v opačnom prípade vráti FALSE.
     */
    static bool computeLogarithm(big vysledok, int distParam);
    /**
     * @brief Funkcia testujúca bod eliptickej krivky (distinguished point).
     * Funkcia filtruje tzv. distinguished body eliptickej krivky. Ako test je využívaná jednoduchá
     * modulárna operácia na druhej (y) súradnici bodu. Operácia je parametrizovaná hodnotou @a dist
     * a navrhnutá tak aby bola čo najefektívnejšia.
     * @note Bod v nekonečne (infinity point) je ignorovaný a nikdy nemôže byť považovaný za význačný.
     * @param[in] X  je bod na eliptickej krivke typu epoint*, ktorý testujeme.
     * @param[in] distMod hodnota, ktorou modulujeme súradnicu pri filtrácii.
     * @warning Funkcia nie je thread-safe (kvôli efektivite).
     * @return Vráti TRUE, ak bod @a X je distinguished, v opačnom prípade vráti FALSE.
     */
    static bool isDistinguished(epoint * X, big distMod);
};
#endif /* CRHOTABALG_HEADER */
